package main

import (
	"fmt"
	"time"
)

//所谓高阶函数，就是接收其他函数作为参数传入，或者把其他函数作为结果返回的函数。
//40闭包.go 的示例，就是高阶函数。

//这是一个简单的乘法函数，想要在不修改它代码的基础上，给它增加输出执行耗时的功能。
func multiply(a int, b int) int {
	return a * b
}

//这里的作用，是给这种函数类型，起一个别名
type MultiplyFunc func(int, int) int

//接收一个函数，返回一个函数
func execTime(f MultiplyFunc) MultiplyFunc {
	//给原来的函数，做了“装饰”
	return func(a, b int) int {
		start := time.Now()
		c := f(a, b)
		duration := time.Since(start)
		fmt.Printf("--- 执行耗时: %v ---\n", duration)
		return c
	}
}

func main() {
	//经过execTime的包裹，得到了一个新的函数f，它已不是原来的multiply了，而是被装饰过的，也就是拥有了计算耗时功能的
	f := execTime(multiply)
	r := f(3, 8) //会输出耗时
	fmt.Println(r)
}
